home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / programer2 / euclidlib / c / shape < prev   
Text File  |  1992-04-12  |  2KB  |  60 lines

  1. /**** shape.c ****/
  2. /* By Paul Field
  3.  * See !ReadMe file for distribution/modification restrictions
  4.  */
  5.  
  6. #include "shape.h"
  7.  
  8. static euclid_coord vertex[8];  /* Vertices of the cube */
  9.  
  10. static euclid_coord *face[6][4] = /* Pointers to the vertices making up each face */
  11.  { { &vertex[0], &vertex[1], &vertex[3], &vertex[2] },
  12.    { &vertex[0], &vertex[4], &vertex[5], &vertex[1] },
  13.    { &vertex[0], &vertex[2], &vertex[6], &vertex[4] },
  14.    { &vertex[2], &vertex[3], &vertex[7], &vertex[6] },
  15.    { &vertex[3], &vertex[7], &vertex[5], &vertex[1] },
  16.    { &vertex[7], &vertex[6], &vertex[4], &vertex[5] }
  17.  };
  18.  
  19. os_error *shape_makecube(euclid_header *h, unsigned int size, euclid_solid **cube)
  20.  { os_error *e;
  21.  
  22.    if ((e = euclid_create(6, h, eid_solid, cube))==NULL)
  23.     { int fno, vno;
  24.       euclid_coord *v;
  25.  
  26.       (*cube)->boundingradius = +(17321 * size)/10000;  /* size * sqrt(3) */
  27.       /* euclid_create makes boundingcentre = {0,0,0} */
  28.  
  29.       size /= 2;
  30.       for (vno = 0, v = vertex; vno < 8; vno++, v++)
  31.        { v->x = (vno % 2 == 0) ? size : -size;
  32.          v->y = (vno % 8 < 4)  ? size : -size;
  33.          v->z = (vno % 4 >= 2) ? size : -size;
  34.        }
  35.  
  36.       for (fno = 0; fno <= 5 && !e; fno++)
  37.        { euclid_plane *p;
  38.  
  39.          if ((e = euclid_create(4, h, eid_plane, &p)) == NULL)
  40.           { euclid_coord *points, **fpoints;
  41.             int cno;
  42.  
  43.             (*cube)->var[fno].plane = p;
  44.             points = p->point;
  45.             fpoints = face[fno];
  46.             for (cno = 3; cno >= 0; cno--)
  47.              { *points++ = **fpoints++;
  48.              }
  49.           }
  50.        }
  51.       if (e)
  52.        { for (--fno; fno >= 0; fno--)
  53.           { euclid_destroy(h, (*cube)->var[fno].plane);
  54.           }
  55.          euclid_destroy(h, *cube);
  56.        }
  57.     }
  58.    return(e);
  59.  }
  60.